unit u_dm_produtorequisicao;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, u_dm_padrao, FMTBcd, DB, DBClient, Provider, SqlExpr;

type
  Tdm_produtorequisicao = class(Tdm_padrao)
    cdsConsultaCOD_REQUISICAO: TIntegerField;
    cdsConsultaLIG_COD_EMPRESA: TIntegerField;
    cdsConsultaLIG_COD_FUNCIONARIO: TIntegerField;
    cdsConsultaSITUACAO: TStringField;
    cdsConsultaSITUACAO_DESC: TStringField;
    cdsConsultaOBS: TStringField;
    cdsConsultaDATA_CAD: TDateField;
    cdsConsultaDATA_ALTERACAO: TDateField;
    cdsConsultaTOTAL_REQUERIDO: TFMTBCDField;
    cdsConsultaTOTAL_DEVOLVIDO: TFMTBCDField;
    cdsConsultaTOTAL_PENDENTE: TFMTBCDField;
    cdsConsultaFUNCIONARIO: TStringField;
    cdsConsultaFUNCIONARIO_DEPTO: TStringField;
    cdsConsultaEMPRESA: TStringField;
    cdsRegistroCOD_REQUISICAO: TIntegerField;
    cdsRegistroLIG_COD_EMPRESA: TIntegerField;
    cdsRegistroLIG_COD_FUNCIONARIO: TIntegerField;
    cdsRegistroDATA_CAD: TDateField;
    cdsRegistroDATA_ALTERACAO: TDateField;
    cdsRegistroOBS: TStringField;
    dsMestre_Detalhe: TDataSource;
    sqlConsultaItens: TSQLQuery;
    sqlConsultaItensLIG_COD_REQUISICAO: TIntegerField;
    sqlConsultaItensLIG_COD_PRODUTO: TIntegerField;
    sqlConsultaItensQTDE_REQUERIDA: TIntegerField;
    sqlConsultaItensQTDE_DEVOLVIDA: TIntegerField;
    sqlConsultaItensQTDE_PENDENTE: TFMTBCDField;
    sqlConsultaItensDATA_VENCIMENTO: TDateField;
    sqlConsultaItensDATA_REGISTRO: TDateField;
    sqlConsultaItensPRODUTO: TStringField;
    cdsConsultaItens: TClientDataSet;
    cdsConsultaItensLIG_COD_REQUISICAO: TIntegerField;
    cdsConsultaItensLIG_COD_PRODUTO: TIntegerField;
    cdsConsultaItensQTDE_REQUERIDA: TIntegerField;
    cdsConsultaItensQTDE_DEVOLVIDA: TIntegerField;
    cdsConsultaItensQTDE_PENDENTE: TFMTBCDField;
    cdsConsultaItensDATA_VENCIMENTO: TDateField;
    cdsConsultaItensDATA_REGISTRO: TDateField;
    cdsConsultaItensPRODUTO: TStringField;
    cdsConsultasqlConsultaItens: TDataSetField;
    sqlRequisicaoItens: TSQLQuery;
    dspRequisicaoItens: TDataSetProvider;
    cdsRequisicaoItens: TClientDataSet;
    cdsRequisicaoItensLIG_COD_REQUISICAO: TIntegerField;
    cdsRequisicaoItensLIG_COD_PRODUTO: TIntegerField;
    cdsRequisicaoItensQTDE_REQUERIDA: TIntegerField;
    cdsRequisicaoItensQTDE_DEVOLVIDA: TIntegerField;
    cdsRequisicaoItensDATA_VENCIMENTO: TDateField;
    cdsRequisicaoItensDATA_REGISTRO: TDateField;
    spReqBaixarItem: TSQLStoredProc;
    spReqEstornaItem: TSQLStoredProc;
    cdsAuxRequisicao: TClientDataSet;
    cdsAuxRequisicaoLIG_COD_PRODUTO: TIntegerField;
    cdsAuxRequisicaoPRODUTO: TStringField;
    cdsAuxRequisicaoQTDE_REQUERIDA: TIntegerField;
    cdsAuxRequisicaoQTDE_DEVOLVIDA: TIntegerField;
    cdsAuxRequisicaoQTDE_PENDENTE: TIntegerField;
    cdsAuxRequisicaoDATA_VENCIMENTO: TDateField;

  private

  public
    procedure InserirItensRequisicao(CodProduto,Quantidade:integer; DataVenc:TDate; Produto:String);
    procedure InserirListaItens;

    procedure RemoverRequisicaoItens;
    procedure BaixarRequisicaoItens(Quantidade:integer);
    procedure EstornarRequisicaoItens;
  end;

var
  dm_produtorequisicao: Tdm_produtorequisicao;

implementation

uses lib_sistema;

{$R *.dfm}

{ Tdm_produtorequisicao }

procedure Tdm_produtorequisicao.BaixarRequisicaoItens(Quantidade:integer);
begin
  spReqBaixarItem.Params[0].AsInteger := cdsConsultaItensLIG_COD_REQUISICAO.AsInteger;
  spReqBaixarItem.Params[1].AsInteger := cdsConsultaItensLIG_COD_PRODUTO.AsInteger;
  spReqBaixarItem.Params[2].AsInteger := Quantidade;
  spReqBaixarItem.ExecProc;
end;

procedure Tdm_produtorequisicao.EstornarRequisicaoItens;
begin
  spReqEstornaItem.Params[0].AsInteger := cdsConsultaItensLIG_COD_REQUISICAO.AsInteger;
  spReqEstornaItem.Params[1].AsInteger := cdsConsultaItensLIG_COD_PRODUTO.AsInteger;
  spReqEstornaItem.Params[2].AsInteger := cdsConsultaItensQTDE_DEVOLVIDA.AsInteger;
  spReqEstornaItem.ExecProc;
  cdsConsulta.Refresh;
end;

procedure Tdm_produtorequisicao.InserirItensRequisicao(CodProduto,Quantidade:integer; DataVenc:TDate; Produto:String);
begin
  if cdsRegistro.State in [dsInsert] then
  begin
    if cdsAuxRequisicao.Locate('lig_cod_produto',CodProduto,[loPartialKey,loCaseInsensitive]) then Exit;
    cdsAuxRequisicao.Open;
    cdsAuxRequisicao.Append;
    cdsAuxRequisicaoLIG_COD_PRODUTO.AsInteger  := CodProduto;
    cdsAuxRequisicaoPRODUTO.AsString           := Produto;
    cdsAuxRequisicaoQTDE_REQUERIDA.AsInteger   := Quantidade;
    cdsAuxRequisicaoQTDE_DEVOLVIDA.AsInteger   := 0;
    cdsAuxRequisicaoQTDE_PENDENTE.AsInteger    := Quantidade;
    cdsAuxRequisicaoDATA_VENCIMENTO.AsDateTime := DataVenc;
    cdsAuxRequisicao.Post;
  end;
  if cdsRegistro.State in [dsEdit] then
  begin
    cdsRequisicaoItens.Open;
    if cdsConsultaItens.Locate('lig_cod_produto',CodProduto,[loPartialKey,loCaseInsensitive]) then
    begin
      cdsRequisicaoItens.Close;
      sqlRequisicaoItens.Params[0].AsInteger := cdsConsultaItensLIG_COD_REQUISICAO.AsInteger;
      sqlRequisicaoItens.Params[1].AsInteger := cdsConsultaItensLIG_COD_PRODUTO.AsInteger;
      cdsRequisicaoItens.Open;
      cdsRequisicaoItens.Edit;
      cdsRequisicaoItensQTDE_REQUERIDA.AsInteger   := cdsConsultaItensQTDE_REQUERIDA.AsInteger + Quantidade;
      cdsRequisicaoItensDATA_VENCIMENTO.AsDateTime := DataVenc;
    end else
    begin
      cdsRequisicaoItens.Append;
      cdsRequisicaoItensLIG_COD_REQUISICAO.AsInteger := cdsConsultaCOD_REQUISICAO.AsInteger;
      cdsRequisicaoItensLIG_COD_PRODUTO.AsInteger    := CodProduto;
      cdsRequisicaoItensQTDE_REQUERIDA.AsInteger     := Quantidade;
      cdsRequisicaoItensDATA_VENCIMENTO.AsDateTime   := DataVenc;
    end;
    cdsRequisicaoItens.Post;
    if cdsRequisicaoItens.ApplyUpdates(0) <> 0 then Exit;
    cdsConsulta.Refresh;
  end;
end;

procedure Tdm_produtorequisicao.InserirListaItens;
begin
  cdsAuxRequisicao.First;
  while not cdsAuxRequisicao.Eof do
  begin
    cdsRequisicaoItens.Open;
    cdsRequisicaoItens.Append;
    cdsRequisicaoItensLIG_COD_REQUISICAO.AsInteger := Identificador;
    cdsRequisicaoItensLIG_COD_PRODUTO.AsInteger    := cdsAuxRequisicaoLIG_COD_PRODUTO.AsInteger;
    cdsRequisicaoItensQTDE_REQUERIDA.AsInteger     := cdsAuxRequisicaoQTDE_REQUERIDA.AsInteger;
    cdsRequisicaoItensDATA_VENCIMENTO.AsDateTime   := cdsAuxRequisicaoDATA_VENCIMENTO.AsDateTime;
    cdsRequisicaoItens.Post;
    cdsAuxRequisicao.Next;
  end;
end;

procedure Tdm_produtorequisicao.RemoverRequisicaoItens;
begin
  if not Confirma('Deseja realmente remover este registro da lista ?') then Exit;
  if ((cdsRegistro.State in [dsInsert]) and (not cdsAuxRequisicao.IsEmpty)) then cdsAuxRequisicao.Delete;
  if ((cdsRegistro.State in [dsEdit])   and (not cdsConsultaItens.IsEmpty)) then
  begin
    cdsRequisicaoItens.Close;
    sqlRequisicaoItens.Params[0].AsInteger := cdsConsultaItensLIG_COD_REQUISICAO.AsInteger;
    sqlRequisicaoItens.Params[1].AsInteger := cdsConsultaItensLIG_COD_PRODUTO.AsInteger;
    cdsRequisicaoItens.Open;
    cdsRequisicaoItens.Delete;
    cdsRequisicaoItens.ApplyUpdates(0);
    cdsConsulta.Refresh;
  end;
end;

end.
